<?php

Class calendario {

             function calcola_orario($prenotazioni,$durata){//prende come parametri la lista delle prenotazioni e la durata complessiva dei servizi da prenotare
                global $orario;
                $orario=setcontents::getResult("SELECT * FROM orario");
                $offset=setcontents::getResult("SELECT * FROM servizio_erogato ORDER BY durata");//Considererò la durata del primo servizio (il più breve) come offset tra un orario e l'altro.(Potrebbe essere impostato anche il più frequente)
                $c=1;//moltiplicatore numero di giorni da sommare a quello corrente
                $init=date("H-i-s",time());//in questo modo calcolo il time stamp del giorno atuale alle ore 0:00.
                list($ore,$minuti,$secondi)=explode("-",$init);
                $init=time()-(($ore*3600)+($minuti*60)+$secondi);
                for ($i=0; $i<10; $i++){//inizializzo i giorni della settimana
                        $date_list[$i]['data'] = $init + $c*(24 * 60 * 60);//le prenotazioni si possono effettuare dal giorno successivo in poi, fino ad un massimo di dieci giorni dalla data di prenotazione

                        $c++;
                        if ((!strcmp(date("D",$date_list[$i]['data']),date("D",$orario[0]['giorno_chiusura']))) ||(!strcmp(date("D",$date_list[$i]['data']),"Sun"))){//Se il giorno calcolato corrisponde a quello di chiusura o a domenica, viene memorizzato il successivo.
                            $i--;
                            continue;
                        }
                        $am=1;//guardia
                        $pm=1;//guardia
                        $b=0;//indice
                        $date_list[$i]['ora'][0]=$date_list[$i]['data']+$orario[0]['or_ap_am'];//inizializzo il primo appuntamento disponibile all'orario di apertura am e lo sommo al timestamp della data odierna alle ore 0:00.(anche l'offset è calcolato in secondi).
                        $or_ch_am=$date_list[$i]['data']+$orario[0]['or_ch_am'];
                        while ($am){//orari mattina
                            if (((($date_list[$i]['ora'][$b]+$offset[0]['durata']*60)/*durata in sec del servizio più breve*/)<$or_ch_am) and (($date_list[$i]['ora'][$b]+($offset[0]['durata']*60)+$durata)<=$or_ch_am)){//controllo che il prossimo orario disponibile (calcolato sul precedente sommando la durata del servizio più breve) sia minore dell'orario di chiusura. Inoltre controllo che la somma dell'orario disponibile con la durata dei servizi selezionati dall'utente non ecceda l'orario di chiusura.

                                $am=1;
                                $b++;
                                $date_list[$i]['ora'][$b]=$date_list[$i]['ora'][$b-1]+($offset[0]['durata']*60);

                            }else{//se non sono presenti prenotazioni

                                $am=0;
                                }
                            }

                        $b++;
                        $date_list[$i]['ora'][$b]=$date_list[$i]['data']+$orario[0]['or_ap_pm'];//inizializzo il primo appuntamento disponibile all'orario di apertura pm
                        $or_ch_pm=$date_list[$i]['data']+$orario[0]['or_ch_pm'];
                        while ($pm){//orari pomeriggio
                            if (((($date_list[$i]['ora'][$b]+($offset[0]['durata']*60))/*durata in sec del servizio più breve*/)<$or_ch_pm) and (($date_list[$i]['ora'][$b]+($offset[0]['durata']*60)+$durata)<=$or_ch_pm)){//controllo che il prossimo orario disponibile (calcolato sul precedente sommando la durata del servizio più breve) sia minore dell'orario di chiusura. Inoltre controllo che la somma dell'orario disponibile con la durata dei servizi selezionati dall'utente non ecceda l'orario di chiusura.
                                $pm=1;
                                $b++;
                                $date_list[$i]['ora'][$b]=$date_list[$i]['ora'][$b-1]+($offset[0]['durata']*60);
                            }else{
                                $pm=0;
                                }
                            }
                        if ($prenotazioni!=null){
                            calendario::escludi_pren($date_list[$i],$durata,$prenotazioni);
                        }
                }
        
                return $date_list;
        }

         function escludi_pren(&$array_orari,$durata,$prenotazioni){
            foreach ($prenotazioni as $k_p=>$v_p){//controllo se la data passata per parametro corrisponde ad una delle date nelle quali sono già stati fissati uno o più appuntamenti.
                    foreach ($array_orari['ora'] as $k_o => $v_o){//devo scansire tutti gli orari e controllare nell'if quali sono compresi dentro gli orari corrispondenti agli appuntamenti
                        if (!isset($v_o[1])){//se l'orario è già assegnato ad un'altra prenotazione non effettuare il controllo.Infatti qualora fosse assegnato v_o non corrisponde ad un timestamp, bensì an un array con due campi contenenti timestamp ed un intero che indica lo stato.
                            if (($v_o>=$v_p['data_pren'] and $v_o<($v_p['data_pren']+($v_p['SUM(durata)']*60))) ||//se l'orario è compreso nell'arco di tempo relativo ad una prenotazione o
                               ((($v_o+$durata)>$v_p['data_pren']) and (($v_o)<($v_p['data_pren'])))){// non è compreso, ma si sovrappone ad un'altra prenotazione
                                $array_orari['ora'][$k_o]=array($v_o,0);//assegna all'elemento corrente un array contenente il valore dell'orario e un tag (quest'ultimo sarà utile per la logica di visualizzazione)
                            }
                        }

                    }
            }
        }

}

?>

